package org.madmac.join;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.madmac.maquina.Maquina;

import org.madmac.exception.MXSXPNotFoundException;
import org.wakeful.conn.Connection;

/**
 * TODO: Retirar essa classe e criar objs do tipo Setor e Pessoa no bean Maquina.
 * @author atila camurca
 * @deprecated 
 */
public class MaquinasXSetoresXPessoas extends Maquina {

	private static MaquinasXSetoresXPessoas instance;

	private MaquinasXSetoresXPessoas() {
	}

	public static MaquinasXSetoresXPessoas getInstance() {
		if (instance == null) {
			instance = new MaquinasXSetoresXPessoas();
		}
		return instance;
	}

	/**
	 *
	 * @param searchTombamento
	 * @return
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 * @throws Exception
	 * @deprecated Use findByTombamento(int)
	 * FIXME: mudar para findByTombamento(int) de MaquinaDao.
	 */
	public Maquina selectMaquinaDetails(int searchTombamento) throws SQLException, ClassNotFoundException, Exception {

		Maquina maquina = null;

		java.sql.Connection conn = Connection.getInstance();
		/**
		 * Modificado por: Átila Camurça em 09 Jul 10.
		 * Seleciona os detalhes de uma determinada máquina por seu tombamento.
		 */
		StringBuilder builder = new StringBuilder();
		builder.append("SELECT m.id_maquina, m.id_setor, m.tombamento, m.id_pessoa, ");
		builder.append("p.nome AS responsavel, m.sistema_op, s.nome AS setor ");
		builder.append("FROM madmac.maquina m ");
		builder.append("LEFT JOIN madmac.setor s ");
		builder.append("ON m.id_setor = s.id_setor ");
		builder.append("LEFT JOIN madmac.pessoa p ");
		builder.append("ON m.id_pessoa = p.id_pessoa ");
		builder.append("WHERE m.tombamento = ? ");
		builder.append("ORDER BY s.nome");
		String sql = builder.toString();
		PreparedStatement pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, searchTombamento);

		ResultSet rs = null;
		try {
			rs = pstmt.executeQuery();

			if (rs.next()) {
				maquina = new Maquina();

				maquina.setIdMaquina(rs.getInt("id_maquina"));
				maquina.setIdSetor(rs.getInt("id_setor"));
				maquina.setTombamento(rs.getInt("tombamento"));
				maquina.setIdPessoa(rs.getInt("id_pessoa"));
				maquina.setResponsavel(rs.getString("responsavel"));
				maquina.setSistemaOp(rs.getString("sistema_op"));
				maquina.setSetor(rs.getString("setor"));

			} else {
				throw new MXSXPNotFoundException("O tombamento selecionado não está cadastrado.");
			}
		} catch (Exception e) {			
			throw new Exception(e);
		}
		return maquina;
	}

	/**
	 *
	 * @return
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 * @throws Exception
	 * @deprecated 
	 */
	public List<Maquina> selectAllMaquinas() throws SQLException, ClassNotFoundException, Exception {

		List<Maquina> lista = new ArrayList<Maquina>();

		java.sql.Connection conn = Connection.getInstance();
		Statement stmt = conn.createStatement();

		/**
		 * Modificado por: Átila Camurça em 01 Jul 09.
		 * Seleciona todas as máquinas. Não é utilizada neste momento.
		 */
		String sql = "SELECT mm.id_maquina, mm.code_setor, mm.tombamento, mm.code_pessoa, up.nome AS responsavel, ";
		sql += "mm.sistema_op, us.nome AS setor ";
		sql += "FROM madmac.maquinas mm, unify.setores us, unify.pessoas up ";
		sql += "WHERE mm.code_setor = us.code_setor ";
		sql += "AND mm.code_pessoa = up.code_pessoa ";
		sql += "ORDER BY us.nome ";

		ResultSet rs = null;
		try {
			rs = stmt.executeQuery(sql);
		} catch (Exception e) {
			return null;
		}

		while (rs.next()) {

			Maquina maquina = new Maquina();

			int id_maquina = rs.getInt("id_maquina");
			int code_setor = rs.getInt("code_setor");
			int tombamento = rs.getInt("tombamento");
			int code_pessoa = rs.getInt("code_pessoa");
			String responsavel = rs.getString("responsavel");
			String sistema_op = rs.getString("sistema_op");
			String setor = rs.getString("setor");


			maquina.setId_maquina(id_maquina);
			maquina.setCode_setor(code_setor);
			maquina.setTombamento(tombamento);
			maquina.setCode_pessoa(code_pessoa);
			maquina.setResponsavel(responsavel);
			maquina.setSistemaOp(sistema_op);
			maquina.setSetor(setor);

			lista.add(maquina);
		}

		return lista;
	}

	public List<Maquina> selectAllBySetor(int search_setor) throws SQLException, ClassNotFoundException, Exception {

		List<Maquina> lista = new ArrayList<Maquina>();

		java.sql.Connection conn = Connection.getInstance();
		/**
		 * Modificado por: Átila Camurça em 09 Jul 10.
		 * Seleciona os detalhes de uma determinada máquina pelo Setor(code_setor).
		 */
		StringBuilder builder = new StringBuilder();
		builder.append("SELECT m.id_maquina, m.tombamento, m.id_setor, m.id_pessoa, ");
		builder.append("m.sistema_op, s.nome AS setor, hd.caminho, p.nome AS responsavel ");
		builder.append("FROM madmac.maquina m ");
		builder.append("LEFT JOIN madmac.setor s ");
		builder.append("ON m.id_setor = s.id_setor ");
		builder.append("LEFT JOIN madmac.pessoa p ");
		builder.append("ON m.id_pessoa = p.id_pessoa ");
		builder.append("LEFT JOIN madmac.host_details hd ");
		builder.append("ON hd.hostnumber = m.tombamento ");
		builder.append("WHERE m.id_setor = ? ");
		builder.append("ORDER BY s.nome, m.tombamento");
		String sql = builder.toString();
		PreparedStatement pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, search_setor);

		ResultSet rs = null;
		try {
			rs = pstmt.executeQuery();

			while (rs.next()) {
				Maquina maquina = new Maquina();
				maquina.setId_maquina(rs.getInt("id_maquina"));
				maquina.setIdSetor(rs.getInt("id_setor"));
				maquina.setTombamento(rs.getInt("tombamento"));
				maquina.setIdPessoa(rs.getInt("id_pessoa"));
				maquina.setResponsavel(rs.getString("responsavel"));
				maquina.setSistemaOp(rs.getString("sistema_op"));
				maquina.setSetor(rs.getString("setor"));
				maquina.setPath(rs.getString("caminho"));

				lista.add(maquina);
			}
		} catch (Exception e) {
			return null;
		} finally {
			pstmt.close();
			if (rs != null) {
				rs.close();
			}
		}
		return lista;
	}
}
